package cn.itcast.zt.example.singleton;

import cn.itcast.zt.annotation.Recommend;
import cn.itcast.zt.annotation.ThreadSafe;

import java.io.Serializable;

/**
 * 静态内部类：最安全
 * 加载一个类时，其内部类不会同时被加载。
 * 一个类被加载，当且仅当其某个静态成员（静态域、构造器、静态方法等）被调用时发生。。
 * 单例结构通过反射无法被破坏，但可以通过序列化与反序列化破坏
 */
@ThreadSafe
@Recommend
public class SingletonExample9 implements Serializable {

    private static volatile boolean initialized = false ;

    // 私有构造函数
    private SingletonExample9(){
        synchronized (SingletonExample9.class){
            if(!initialized){
                initialized = !initialized ;
            }else {
                throw new RuntimeException("单例已被破坏");
            }
        }
    }

    private static class Singleton {
        private static final SingletonExample9 INSTANCE = new SingletonExample9() ;
    }

    public static SingletonExample9 getInstance(){
        return  Singleton.INSTANCE ;
    }
}
